#include "../GlobalClass.h"
#include "VersionCheck.h"

VersionCheck::VersionCheck(QObject *parent) : QObject(parent)
{
    m_nLastestVersion = -1;
    m_nForceVersion = -1;
    m_nBroadcastVersion = -1;

    connect(&m_HTTP, &HTTPDownload::s_finished, this, [=](QNetworkReply* reply)
    {
        //获取响应的信息，状态码为200表示正常
        QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

        if(reply->error() == QNetworkReply::NoError && status_code == 200)
        {
            int ret = parseJsonVersion(m_HTTP.m_baHttpData);
            if(ret == 0)
            {
                emit s_JsonParseResult();
                return;
            }
            else
            {
                qCritical() << m_HTTP.m_baHttpData;
                emit s_Critical(_T("[!VersionCheck]parseJsonVersion ERROR:%1").arg(ret));
                return;
            }

        }
        else
        {
            emit s_Critical(_T("[!VersionCheck]reply ERROR:%1").arg(status_code.toInt()));
            return;
        }
    });
}

VersionCheck::~VersionCheck()
{

}

int VersionCheck::checkVersion()
{
    if(!m_HTTP.download(QUrl(m_strJsonURL),"",false))
    {
        emit s_Critical(_T("[!VersionCheck]checkVersion ERROR!"));
        return -1;
    }
    return 0;
}


int VersionCheck::parseJsonVersion(QByteArray &byteArray)
{
    QJsonParseError jsonError;
    QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);  // 转化为 JSON 文档
    if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))  // 解析未发生错误
    {
        if (doucment.isObject()) // JSON 文档为对象
        {
            QJsonObject rootObject = doucment.object();  // 转化为对象

            if (rootObject.contains("ForceUpdateVersion"))  // 包含指定的 key
            {
                QJsonValue value = rootObject.value("ForceUpdateVersion");  // 获取指定 key 对应的 value
                if (value.isString())  // 判断 value 是否为字符串
                {
                    //QString strName = value.toString();  // 将 value 转化为字符串
                    m_nForceVersion = value.toString().toInt();
                }
                else if (value.isDouble())  // 判断 value 是否为
                {
                    //qDebug() << "Version : " << value.toDouble();
                    m_nForceVersion = value.toInt();
                }
                else
                {
                    emit s_Critical(_T("[!VersionCheck]ForceUpdateVersion ERROR!"));
                    return -3;
                }
            }
            else
            {
                emit s_Critical(_T("[!VersionCheck]NO ForceUpdateVersion ERROR!"));
                return -4;
            }


            if (rootObject.contains("LastestVersion"))  // 包含指定的 key
            {
                QJsonValue value = rootObject.value("LastestVersion");  // 获取指定 key 对应的 value
                if (value.isString())  // 判断 value 是否为字符串
                {
                    //QString strName = value.toString();  // 将 value 转化为字符串
                    m_nLastestVersion = value.toString().toInt();
                }
                else if (value.isDouble())  // 判断 value 是否为
                {
                    //qDebug() << "Version : " << value.toDouble();
                    m_nLastestVersion = value.toInt();
                }
                else
                {
                    emit s_Critical(_T("[!VersionCheck]LastestVersion ERROR!"));
                    return -5;
                }
            }
            else
            {
                emit s_Critical(_T("[!VersionCheck]NO LastestVersion ERROR!"));
                return -6;
            }


            if (rootObject.contains("BroadcastVersion"))   // 包含指定的 key
            {
                QJsonValue value = rootObject.value("BroadcastVersion");  // 获取指定 key 对应的 value
                if (value.isString())   // 判断 value 是否为字符串
                {
                    //QString strName = value.toString();  // 将 value 转化为字符串
                    m_nBroadcastVersion = value.toString().toInt();
                }
                else if (value.isDouble()) {  // 判断 value 是否为
                    //qDebug() << "Version : " << value.toDouble();
                    m_nBroadcastVersion = value.toInt();
                }
                else
                {
                    emit s_Critical(_T("[!VersionCheck]BroadcastVersion ERROR!"));
                    return -7;
                }
            }
            else
            {
                emit s_Critical(_T("[!VersionCheck]NO BroadcastVersion ERROR!"));
                return -8;
            }


            if (rootObject.contains("BroadcastContent"))   // 包含指定的 key
            {
                QJsonValue value = rootObject.value("BroadcastContent");  // 获取指定 key 对应的 value
                if (value.isString()) {  // 判断 value 是否为字符串
                    //QString strName = value.toString();  // 将 value 转化为字符串
                    m_strBroadcastContent = value.toString();
                }
                else
                {
                    emit s_Critical(_T("[!VersionCheck]BroadcastContent ERROR!"));
                    return -9;
                }
            }
            else
            {
                emit s_Critical(_T("[!VersionCheck]NO BroadcastContent ERROR!"));
                return -10;
            }

            if (rootObject.contains("UpdateURL"))   // 包含指定的 key
            {
                QJsonValue value = rootObject.value("UpdateURL");  // 获取指定 key 对应的 value
                if (value.isString()) {  // 判断 value 是否为字符串
                    //QString strName = value.toString();  // 将 value 转化为字符串
                    m_strUpdateURL = value.toString();
                }
                else
                {
                    emit s_Critical(_T("[!VersionCheck]UpdateURL ERROR!"));
                    return -11;
                }
            }
            else
            {
                emit s_Critical(_T("[!VersionCheck]NO UpdateURL ERROR!"));
                return -12;
            }

        }
        else
        {
            emit s_Critical(_T("[!VersionCheck]Json Root ERROR!"));
            return -2;
        }
    }
    else
    {
        emit s_Critical(_T("[!VersionCheck]Json ERROR:%1").arg(jsonError.errorString()));
        return -1;
    }

    return 0;
}
